package com.coolingme.Field;

import com.coolingme.domain.Person;

import java.lang.reflect.Field;

/**
 * Field中的常用方法
 *
 * @author wangyue
 * @date 2019/3/15 12:59
 */
public class PersonFieldTest {

    public static void main(String[] args) {

        // 先获取类的对象
        Class clazz = null;
        try {
            clazz = Class.forName("com.coolingme.domain.Person");

            // 获取参数对象，方式一，获取具体的某个属性
            // 局限：知道属性名是什么，属性是共有的
            Field field = clazz.getField("name");
            System.out.println(field);

            // 获取参数对象，方式二，获取全部属性
            // 只能获取自身和父类的共有属性
            Field[] fields = clazz.getFields();
            for (Field f : fields) {
                System.out.println(f.getName());
            }

            // 1.获取参数的修饰符,同Class的操作符
            int modifiers = field.getModifiers();
            System.out.println(modifiers);

            // 2.获取参数的类型
            Class fieldClass = field.getType();
            System.out.println(fieldClass);

            // 3.获取参数的名称
            String fieldName = field.getName();
            System.out.println(fieldName);

            // 4.通过属性对象赋值
            //Person person = new Person();
            Person person = (Person) clazz.newInstance();
            // 属性对象.set(对象,"String");
            field.set(person, "wangyue");
            System.out.println(person);

            // 5.取值
            // 属性对象.get(对象)
            String name = (String) field.get(person);
            System.out.println(name + '\n');


            // 6.通过 clazz 获取私有属性
            // 只能获取本类中的 共有和私有属性
            Field ageField = clazz.getDeclaredField("age");
            // 属性名
            System.out.println(ageField.getName());
            // 设置私有属性可以被直接操作
            ageField.setAccessible(true);
            // 给私有属性赋值
            ageField.set(person,23);
            // 取值
            int age = (int) ageField.get(person);
            System.out.println(age);


        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
